iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Odoo

Odoo 14 Javascript 開發心路歷程系列 第 28

Day 28 widget 的 lazy load 介紹

  • 分享至 

  • xImage
  •  

這個各位可能會比較少使用到,建議還是了解一下

widget 有三個屬性是沒有看過原始碼,會比較難知道的

  1. xmlDependencies
  2. jsLibs
  3. cssLibs

這三個屬性會在 willStart 階段才載入

我們可以看一下核心 widget 的程式

// addons/web/static/src/js/core/widget.js
/**
 * Method called between @see init and @see start. Performs asynchronous
 * calls required by the rendering and the start method.
 *
 * This method should return a Promose which is resolved when start can be
 * executed.
 *
 * @returns {Promise}
 */
willStart: function () {
    var proms = [];
    if (this.xmlDependencies) {
        proms.push.apply(proms, _.map(this.xmlDependencies, function (xmlPath) {
            return ajax.loadXML(xmlPath, core.qweb);
        }));
    }
    if (this.jsLibs || this.cssLibs || this.assetLibs) {
        proms.push(this._loadLibs(this));
    }
    return Promise.all(proms);
},

眼尖的各位一定注意到

剛剛提到的三個屬性都在這段程式中出現

而為什麼會說是 lazy load 呢?

各位可以思考一下,在有定義新的 JS 或 CSS/SCSS 時

是不是會到 assets.xml 來註冊到 assets_backend 或其他的 bundle 的模板

在 odoo 的 bundle 是把所有程式集中成一包

而且只有針對換行省略,並沒有做編譯的縮小化

因此 bundle 的內容會越來越大包

如果這時註冊了一個 JS lib 有 1MB+,那麼 bundle 的內容也會增加差不多相同的流量

各位應該有好奇過為什麼 odoo 第一次進畫面這麼慢

就有可能是 bundle 的資源包蠻大的,可以開啟開發者工具的 Network 頁面來觀察

回到正題,在剛剛的例子中,可以發現 bundle 越來越大包

但有些 widget 所需要的 js libs,可能是只有在某幾個功能或是特定時間點才會使用到

因此可以將其定義在三個屬性中,讓使用到 widget 的時候才載入

減少網頁第一次進入時要下載很大的 bundle 資源


上一篇
Day 27 custom_events 介紹
下一篇
Day 29 知識推薦 - throttle, debounce 的應用
系列文
Odoo 14 Javascript 開發心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言